package com.cos.shop.web.controller;

import com.cos.shop.common.Const;
import com.cos.shop.common.ResponseResult;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.lang.reflect.Method;

/**
 * @author: COS
 * @time: 2023/5/9 14:19
 * @description: 父类baseServlet 作为所有自定义servlet|controller的父类
 * 协助处理 处理请求方法的调用以及响应的操作
 */
public class BaseServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //System.out.println("父类 baseServlet");
        // this 当前对象的实例
        //System.out.println(this);
        String method = req.getParameter("method");
        // 判断method 是否为Null
        try {
            //1 获取当前对象的实例
            Class<? extends HttpServlet> aClass = this.getClass();
            //2 直接通过 方法名和参数列表来查询方法
            Method target = aClass.getMethod(method, HttpServletRequest.class, HttpServletResponse.class);
            //3 通过反射调用方法, 优先执行调用方法,回到方法调用处
            String response = (String) target.invoke(this, req, resp);
            //System.out.println("我回来啦");
            // 在这个位置帮我们完成 转发 重定向 和字符串写出
            // 子类方法有返回值 , 让父类帮助处理响应
            //2
            if (response!=null) {
                if (response.contains(Const.FORWARD)) {
                    //转发
                    // response.split(":")[1]
                    req.getRequestDispatcher(response.replace(Const.FORWARD,"")).forward(req,resp);
                }else if(response.contains(Const.REDIRECT)){
                    //重定向
                    resp.sendRedirect(response.replace(Const.REDIRECT,""));
                }else{
                    // 字符串写出 AJAX
                    resp.getWriter().println(response);
                }
            }
        } catch (NullPointerException e) {
            e.printStackTrace();
            //异常处理位置 处理调用出现找不到方法异常
            req.setAttribute("msg", ResponseResult.createFail("啊服务器出错啦 啊哈哈哈"));
            req.getRequestDispatcher("message.jsp").forward(req,resp);
        }catch (Exception e) {
            e.printStackTrace();
            //异常处理位置 处理调用出现找不到方法异常
            req.setAttribute("msg", ResponseResult.createFail("404 找到不啦 O(∩_∩)O哈哈~"));
            req.getRequestDispatcher("message.jsp").forward(req,resp);
        }
    }
}
